package com.raymond.thread.manager.scheduled;

import com.raymond.thread.manager.BaseThread;
import com.raymond.thread.manager.StaticValues;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;

/**
 * 定时线程任务
 *
 * @author :  raymond
 * @version :  V1.0
 * @date :  2020-09-12 00:01
 */
public abstract class BaseScheduledThread extends BaseThread {
    private static final Logger logger = LoggerFactory.getLogger(BaseScheduledThread.class);

    private long startTime;

    public long getStartTime() {
        return startTime;
    }

    @Override
    public final void run() {
        super.run();
        if (StaticValues.IS_STOP) {
            return;
        }
        init();
        try {
            execute();
        } catch (Exception e) {
            logger.error("一次任务线程异常,{}", getName(), e);
        }
        after();
    }
    /**
     * 初始化方法,当前线程启动运行
     */
    protected void init() {
        startTime = System.currentTimeMillis();
        logger.info("定时线程已开始执行,{},开始执行时间:{}", getName(), LocalDateTime.now());
    }

    /**
     * 线程关闭运行的方法
     */
    protected void after() {
        logger.info("定时线程执行结束,{},当前任务耗时:{}毫秒", getName(), System.currentTimeMillis() - getStartTime());
    }
    /**
     * 主体处理任务
     */
    protected abstract void execute();
}
